---
title: "Sydney Tomlak Final Project"
author: "Sydney Tomlak"
format: html
editor: visual
toc: true
toc-location: left
code-tools:
source: true
execute:
echo: false
message: false
warning: false
embed-resources: true
theme: "Journal"
font: "Arial Narrow"
---
```{r, warning= FALSE, message = FALSE}
library(tidyverse)
library(tidyr)
library(moderndive)
library(broom)
library(dplyr)
library(ggplot2)
library(gt)
library(lubridate)
library(ggrepel)
library(scales)
theme_set(theme_light(base_family = "Arial Narrow", ink = "Navy"))
```
# How Viral Sports Moments Affect Stock Returns
## 1. Introduction
All press is good press! Right?
In today’s environment, viral moments can shape public attention instantly — and companies often benefit from that spotlight. This project examines whether highly visible **viral sports moments** are associated with **business success**, which I measure using **stock returns**. Specifically, I focus on Nike, one of the largest and most influential sponsors in global sports.
My goal is to understand how **sports performance**, **marketing exposure and engagement**, and **financial markets** intersect. To do this, I analyze four viral moments involving **Nike-endorsed athletes** and compare them to Nike’s stock performance surrounding each event.
The Four Viral Sports Moments:
1. Tiger Woods - DUI Arrest Video Released - May 31, 2017
{width="235"}
2. Naomi Osaka- Wins US Open - September 12, 2020
{width="655"}
3. Kylian Mbappé — World Cup Final Hat-Trick - December 18, 2022
{width="152"}
4. Lebron James - Flop of the Century Mid Game - March 8, 2025
{width="245"}
For stock data, I use a Kaggle data set that includes daily observations for Nike’s stock price, including the date, opening price, highest and lowest price of the day, closing price, and the trading volume (number of shares). This data set updates every day and provides an accessible way to examine how the market responds to major sports-related events. Below is a snapshot of 5 randomly selected rows from the data set:
```{r}
nike_stock <- read.csv("Nike_historical_data.csv")
sp500_stock <- read.csv("sp500_data.csv")
nike_stock |>
slice_sample(n = 5) |>
gt() |>
tab_header(
title = md("**Sample of Nike Stock Data**"),
subtitle = "Five randomly selected daily observations"
) |>
fmt_number(
columns = where(is.numeric),
decimals = 2
) |>
opt_table_font(
font = list(google_font("Arial Narrow"), default_fonts())
) |>
tab_style(
style = cell_text(color = "navy", font = "Arial Narrow", size = px(13)),
locations = cells_body(columns = everything())
) |>
tab_style(
style = list(
cell_text(
color = "navy",
font = "Arial Narrow",
size = px(16),
weight = "bold"
),
cell_fill(color = "white")
),
locations = cells_title(groups = "title")
) |>
tab_style(
style = cell_text(color = "gray40", font = "Arial Narrow", size = px(13)),
locations = cells_title(groups = "subtitle")
) |>
tab_options(
table.border.top.color = "navy",
table.border.bottom.color = "navy",
table.font.color = "navy",
table.border.top.width = px(2),
table.border.bottom.width = px(2),
data_row.padding = px(4),
heading.align = "center"
) |>
tab_footnote(
footnote = "Source: Kaggle Nike Stock Data"
) |>
opt_table_outline()
```
## 2. Exploratory Data Analysis
The version of the data set used in this project was retrieved on **November 24, 2025** from Kaggle. It includes **daily observations of Nike’s stock price** beginning on **December 2, 1980**, for a total of **11,338 trading days.**
```{r, warning=FALSE, message=FALSE}
price_summary <- nike_stock |>
summarise(
Mean = c(mean(Open, na.rm=TRUE),
mean(High, na.rm=TRUE),
mean(Low, na.rm=TRUE),
mean(Close, na.rm=TRUE)),
`Sample Size (n)` = n(),
`Std. Dev.` = c(sd(Open, na.rm=TRUE),
sd(High, na.rm=TRUE),
sd(Low, na.rm=TRUE),
sd(Close, na.rm=TRUE)),
Median = c(median(Open, na.rm=TRUE),
median(High, na.rm=TRUE),
median(Low, na.rm=TRUE),
median(Close, na.rm=TRUE)),
Min = c(min(Open, na.rm=TRUE),
min(High, na.rm=TRUE),
min(Low, na.rm=TRUE),
min(Close, na.rm=TRUE)),
Max = c(max(Open, na.rm=TRUE),
max(High, na.rm=TRUE),
max(Low, na.rm=TRUE),
max(Close, na.rm=TRUE))
) |>
mutate(
Price_Type = c("Open", "High", "Low", "Close"),
.before = 1
)
price_summary|>
gt() |>
tab_header(
title = md("**Descriptive Statistics: Nike Daily Stock Prices**"),
subtitle = "Rows = Price Type, Columns = Summary Metrics"
) |>
fmt_number(
columns = -Price_Type,
decimals = 2
) |>
opt_table_font(font = list(google_font("Arial Narrow"), default_fonts())) |>
tab_style(
style = cell_text(color = "navy", font = "Arial Narrow", size = px(13)),
locations = cells_body(columns = everything())
) |>
tab_style(
style = list(
cell_text(color = "navy", size = px(16), weight = "bold"),
cell_fill(color = "white")
),
locations = cells_title(groups = "title")
) |>
tab_style(
style = cell_text(color = "gray40", size = px(13)),
locations = cells_title(groups = "subtitle")
) |>
tab_options(
table.border.top.color = "navy",
table.border.bottom.color = "navy",
table.border.top.width = px(2),
table.border.bottom.width = px(2),
heading.align = "center",
data_row.padding = px(4)
) |>
tab_footnote(
footnote = "Source: Kaggle Nike Stock Data"
)
```
Across this full period, Nike’s closing price ranged from **\$0.07 to \$167.31**, with an average daily closing price of approximately **\$24.96( sd = 36.62)**. These descriptive statistics suggest that while Nike’s stock has grown substantially over the last four decades, it has also experienced considerable variability, reflecting broader trends in the financial markets.
```{r}
nike_stock$Date <- as.Date(nike_stock$Date)
ggplot(aes(x= Date, y= Close), data= nike_stock) +
geom_point(color="navy",alpha=0.3)+
scale_x_date(date_labels = "%b %Y")+
labs(
title = "Nike (NKE) Daily Closing Price (1980-2025)",
subtitle = "Observed trend in closing price over time",
x = "Date",
y = "Closing Price (USD)",
caption = "Source: Kaggle Nike Stock Data"
)
```
Looking at the graph of the closing price of Nike stock from 1980-2025 it seems that there has been an **upward trend** in the stock price that has seen a **recent crash around 2021**.
```{r}
nike_monthly <- nike_stock |>
mutate(Date = as.Date(Date),
year_month = floor_date(Date, "month")) |>
group_by(year_month) |>
summarise(avg_close = mean(Close, na.rm = TRUE), .groups = "drop")
event_months <- tibble::tibble(
code = c("V1", "V2", "V3", "V4"),
event = c("Tiger Woods DUI",
"Naomi Osaka Wins US Open",
"Kylian Mbappé Hat‑Trick",
"LeBron James 'Flop'"),
date = as.Date(c("2017-05-31", "2020-09-12", "2022-12-18", "2025-03-08"))
) |>
mutate(year_month = floor_date(date, "month"))
ggplot(nike_monthly, aes(x = year_month, y = avg_close)) +
geom_line(color = "navy") +
geom_point(
data = event_months,
aes(x = year_month,
y = nike_monthly$avg_close[match(year_month, nike_monthly$year_month)]),
color = "firebrick", size = 3
) +
geom_text(
data = event_months,
aes(x = year_month,
y = nike_monthly$avg_close[match(year_month, nike_monthly$year_month)] + 5,
label = code),
size = 4, fontface = "bold", color = "firebrick", vjust = -0.8
) +
labs(
title = "Nike Monthly Average Closing Price with Viral Sports Moments Highlighted",
subtitle = "Each 'V' represents a month with a major viral sports moment",
x = "Year",
y = "Average Closing Price (USD)",
caption = "V1 = Tiger Woods DUI (May, 2017) | V2 = Naomi Osaka Wins US Open (Sep, 2020) |
V3 = Kylian Mbappé Hat-Trick (Dec,2022) | V4 = LeBron James 'Flop' (Mar, 2025)\nSource: Kaggle Nike Stock Data")
```
Placing the timing of the four viral sports moments within the broader trajectory of Nike’s stock performance provides important contextual insight. The **Tiger Woods, Naomi Osaka, and Kylian Mbappé events occurred during periods of upward movement** in Nike’s stock price, while the L**eBron James event took place during a period of declining stock performance.**
```{r}
tiger_event <- as.Date("2017-05-31")
osaka_event <- as.Date("2020-09-12")
mbappe_event <- as.Date("2022-12-18")
lebron_event <- as.Date("2025-03-08")
tiger_60 <- nike_stock |> filter(Date >= tiger_event - days(30) & Date <= tiger_event + days(30))
osaka_60 <- nike_stock |> filter(Date >= osaka_event - days(30) & Date <= osaka_event + days(30))
mbappe_60 <- nike_stock |> filter(Date >= mbappe_event - days(30) & Date <= mbappe_event + days(30))
lebron_60 <- nike_stock |> filter(Date >= lebron_event - days(30) & Date <= lebron_event + days(30))
comparison <- bind_rows(
tiger_60 |> summarise(event = "Tiger Woods DUI",
before = mean(Close[Date < tiger_event], na.rm = TRUE),
after = mean(Close[Date > tiger_event], na.rm = TRUE)),
osaka_60 |> summarise(event = "Naomi Osaka Wins US Open",
before = mean(Close[Date < osaka_event], na.rm = TRUE),
after = mean(Close[Date > osaka_event], na.rm = TRUE)),
mbappe_60 |> summarise(event = "Kylian Mbappé Hat‑Trick",
before = mean(Close[Date < mbappe_event], na.rm = TRUE),
after = mean(Close[Date > mbappe_event], na.rm = TRUE)),
lebron_60 |> summarise(event = "LeBron James 'Flop'",
before = mean(Close[Date < lebron_event], na.rm = TRUE),
after = mean(Close[Date > lebron_event], na.rm = TRUE))
) |>
mutate(
change = after - before,
pct_change = (after - before) / before * 100,
change_color = ifelse(pct_change >= 0, "green3", "firebrick")
)
comparison_clean <- comparison |>
select(-change_color) |>
mutate(
before = round(before, 2),
after = round(after, 2),
change = round(change, 2),
pct_change = round(pct_change, 2)
) |>
rename(
`Event` = event,
`Before (USD)` = before,
`After (USD)` = after,
`Change (USD)` = change,
`% Change` = pct_change
)
comparison_clean |>
gt() |>
tab_header(
title = md("**Nike Stock Price Before and After Viral Sports Moments**"),
subtitle = "Average closing prices ±30 trading days around each event"
) |>
fmt_number(
columns = c("Before (USD)", "After (USD)", "Change (USD)"),
decimals = 2
) |>
fmt_number(
columns = "% Change",
decimals = 2,
pattern = "{x}%"
) |>
opt_table_font(font = list(google_font("Arial Narrow"), default_fonts())) |>
tab_style(
style = cell_text(color = "navy", font = "Arial Narrow", size = px(13)),
locations = cells_body(columns = everything())
) |>
tab_style(
style = list(
cell_text(color = "navy", font = "Arial Narrow", size = px(16), weight = "bold"),
cell_fill(color = "white")
),
locations = cells_title(groups = "title")
) |>
tab_style(
style = cell_text(color = "gray40", font = "Arial Narrow", size = px(13)),
locations = cells_title(groups = "subtitle")
) |>
data_color(
columns = "% Change",
colors = scales::col_bin(
bins = c(-Inf, 0, Inf),
palette = c("firebrick", "green3")
)
) |>
tab_options(
table.border.top.color = "navy",
table.border.bottom.color = "navy",
table.font.color = "navy",
table.border.top.width = px(2),
table.border.bottom.width = px(2),
data_row.padding = px(4),
heading.align = "center"
) |>
tab_footnote(
footnote = "Source: Kaggle Nike Stock Data"
)
```
An analysis of Nike’s closing stock price in the 30 trading days before and after the four viral sports moments suggests that **three of the events were followed by positive price changes**, with the **exception of the LeBron James flop**. Notably, the **post-event increase following the Tiger Woods DUI incident was modest**.
```{r}
ggplot(data = comparison, aes(x = reorder(event, pct_change),
y = pct_change,
fill = change_color)) +
geom_col() +
geom_hline(yintercept = 0, color = "black") +
geom_text(
aes(label = sprintf("%.2f%%", pct_change)),
vjust = ifelse(comparison$pct_change >= 0, -0.5, 1.2),
color = "black",
fontface = "bold",
size = 4
) +
scale_fill_identity() +
labs(
title = "Nike Stock % Change: 30 Trading Days Before vs After Viral Event",
subtitle = "Positive changes shown in green; negative changes in red",
x = "Event",
y = "Average Percent Change in Closing Price",
caption = "Source: Kaggle Nike Stock Data"
) +
theme(
axis.text.x = element_text(angle = 20, hjust = 1, face = "bold"),
plot.title = element_text(face = "bold", hjust = 0.5))
```
By expressing price movements as **percentage changes**, this graph illustrates **the relative magnitude of stock price movements before and after the four viral sports moments**, by slightly controlling for inflation over the 2017 - 2025 time frame. Notably, the LeBron James event exhibited the largest change in Nike’s stock price, with a **decline of 11.09%**.
```{r}
make_event_window <- function(stock_data, event_name, event_date) {
stock_data |>
mutate(Date = as.Date(Date)) |>
filter(Date >= (event_date %m-% months(1)),
Date <= (event_date %m+% months(1))) |>
mutate(
event = event_name,
post = ifelse(Date >= event_date, 1, 0)
)
}
tiger_month <- make_event_window(nike_stock, "Tiger", as.Date("2017-05-31"))
osaka_month <- make_event_window(nike_stock, "Osaka", as.Date("2020-09-12"))
mbappe_month <- make_event_window(nike_stock, "Mbappé", as.Date("2022-12-18"))
lebron_month <- make_event_window(nike_stock, "LeBron", as.Date("2025-03-08"))
combined_month <- bind_rows(tiger_month, osaka_month, mbappe_month, lebron_month)
monthly_avg <- combined_month |>
group_by(event, post) |>
summarise(avg_close = mean(Close, na.rm = TRUE), .groups = "drop") |>
mutate(period = ifelse(post == 1, "After", "Before"))
combined_month$event <- as.factor(combined_month$event)
ggplot(combined_month, aes(x = Date, y = Close,
color = factor(post,
labels = c("Before", "After")))) +
geom_line(linewidth = 1) +
facet_wrap(~event, scales = "free_x") +
scale_color_manual(values = c("Before" = "Navy",
"After" = "Pink")) +
labs(
title = "Nike Stock ±1 Month Around Viral Sports Moments",
subtitle = "Each panel displays Nike's stock price one month before and after the event",
x = "Date",
y = "Closing Price (USD)",
color = "Period",
caption = "Source:Kaggle Nike Stock Data"
) +
theme(
strip.text = element_text(face = "bold"),
plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom",
legend.title = element_text(size = 11, face = "bold", color = "navy"),
legend.text = element_text(size = 10)
)
```
Similar to the chart above, these graphs display the magnitude of percentage changes in Nike’s stock price before and after each event on a linear scale.
## 3. Linear Regression
```{r, warning= FALSE, message =FALSE}
nike_stock <- nike_stock |>
mutate(Date = as.Date(Date))
tiger_event <- as.Date("2017-05-31")
osaka_event <- as.Date("2020-09-12")
mbappe_event <- as.Date("2022-12-18")
lebron_event <- as.Date("2025-03-08")
make_event_window <- function(stock_data, event_name, event_date) {
stock_data |>
filter(Date >= (event_date %m-% months(1)),
Date <= (event_date %m+% months(1))) |>
mutate(
event = event_name,
post = ifelse(Date >= event_date, 1, 0)
)
}
tiger_month <- make_event_window(nike_stock, "Tiger", tiger_event)
osaka_month <- make_event_window(nike_stock, "Osaka", osaka_event)
mbappe_month <- make_event_window(nike_stock, "Mbappe", mbappe_event)
lebron_month <- make_event_window(nike_stock, "LeBron", lebron_event)
combined_month <- bind_rows(tiger_month, osaka_month, mbappe_month, lebron_month)
monthly_data <- combined_month |>
mutate(year_month = floor_date(Date, "month")) |>
group_by(event, year_month, post) |>
summarise(avg_close = mean(Close, na.rm = TRUE), .groups = "drop")
my_gt_theme <- function(gt_table, title_text, subtitle_text = NULL) {
gt_table |>
tab_header(title = md(paste0("**", title_text, "**")),
subtitle = subtitle_text) |>
opt_table_font(font = list(google_font("Arial Narrow"), default_fonts())) |>
tab_style(
style = cell_text(color = "navy", font = "Arial Narrow", size = px(13)),
locations = cells_body()
) |>
tab_style(
style = list(cell_text(color = "navy", size = px(16), weight = "bold")),
locations = cells_title(groups = "title")
) |>
tab_style(
style = cell_text(color = "gray40", size = px(13)),
locations = cells_title(groups = "subtitle")
) |>
tab_options(
table.border.top.color = "navy",
table.border.bottom.color = "navy",
table.font.color = "navy",
table.border.top.width = px(2),
table.border.bottom.width = px(2),
heading.align = "center",
data_row.padding = px(4)
)
}
by_event_model <- monthly_data |>
group_by(event) |>
do(tidy(lm(avg_close ~ post, data = .))) |>
ungroup() |>
mutate(across(where(is.numeric), round, 3))
per_event_table <- by_event_model |>
filter(term == "post") |>
rename(
Event = event,
`Coefficient (Post)` = estimate,
`Std.Error` = std.error,
`t Statistic` = statistic,
`p‑Value` = p.value
) |>
gt() |>
my_gt_theme(
title_text = "Monthly Average Regression (After vs Before)",
subtitle_text = "lm(avg_close ~ post) run separately for each event"
) |>
fmt_number(columns = c(`Coefficient (Post)`, `Std.Error`,
`t Statistic`, `p‑Value`), decimals = 3)|>
tab_footnote(footnote = "Source: Author Calculations Using Kaggle Nike Stock Data")
per_event_table
```
This table reports the results of separate linear regressions estimating the change in Nike’s average monthly closing price before and after each viral sports moment. The “Coefficient (Post)” represents the estimated difference in average stock price in the post-event period relative to the pre-event period. The standard error reflects the precision of each estimate, with larger values indicating greater uncertainty. The t-statistic measures how far the estimated coefficient is from zero relative to its standard error, and the p-value indicates the probability of observing such a result if there were no true effect. Across events, **all coeffiecients are statistically insignificant**, suggesting **limited evidence of price changes following viral sports moments.**
```{r}
pooled_model <- lm(avg_close ~ post + event, data = monthly_data)
pooled_results <- tidy(pooled_model) |>
mutate(across(where(is.numeric), round, 3)) |>
filter(term == "post") |>
rename(
Term = term,
`Estimate` = estimate,
`Std. Error` = std.error,
`t Statistic` = statistic,
`p‑Value` = p.value
)
pooled_results |>
gt() |>
my_gt_theme(
title_text = "Pooled Regression: Overall Effect of Viral Events",
subtitle_text = "Model: lm(avg_close ~ post + event)"
) |>
fmt_number(columns = c(`Estimate`, `Std. Error`,
`t Statistic`, `p‑Value`), decimals = 3) |>
tab_footnote(
footnote = "Source: Author Calculations Using Kaggle Nike Stock Data"
)
```
The pooled regression combines all four events into a single model to estimate the overall association between viral sports moments and Nike’s stock price, while controlling for event-specific differences. The “Post” coefficient captures the average change in stock price across all events after the viral moment. The small magnitude of the estimate and lack of statistical significance indicate that, **on average, viral sports moments are not associated with meaningful or consistent shifts in Nike’s stock price.**
```{r}
nike_stock <- nike_stock |>
mutate(Date = as.Date(Date),
Close = as.numeric(Close),
company = "Nike")
sp500_stock <- sp500_stock |>
mutate(Date = as.Date(Date),
Close = as.numeric(Close),
company = "Control")
all_stock <- bind_rows(nike_stock, sp500_stock)
event_names <- c("Tiger", "Osaka", "Mbappe", "LeBron")
event_dates <- as.Date(c("2017-05-31", "2020-09-12", "2022-12-18", "2025-03-08"))
make_event_window <- function(stock_data, event_name, event_date) {
stock_data |>
filter(Date >= (event_date %m-% months(1)),
Date <= (event_date %m+% months(1))) |>
mutate(event = event_name,
post = ifelse(Date >= event_date, 1, 0))
}
event_window_list <- list()
for (i in seq_along(event_names)) {
temp <- make_event_window(all_stock, event_names[i], event_dates[i])
event_window_list[[i]] <- temp
}
event_window <- bind_rows(event_window_list)
event_window <- event_window |>
mutate(treatment = ifelse(company == "Nike", 1, 0))
monthly_data <- event_window |>
mutate(year_month = floor_date(Date, "month")) |>
group_by(event, company, year_month, post, treatment) |>
summarise(avg_close = mean(Close, na.rm = TRUE), .groups = "drop")
did_model <- lm(avg_close ~ post * treatment, data = monthly_data)
did_results <- broom::tidy(did_model) |>
mutate(across(where(is.numeric), round, 3))
did_table <- did_results |>
rename(
Term = term,
Estimate = estimate,
`Std. Error` = std.error,
`t Statistic` = statistic,
`p‑Value` = p.value
)
my_gt_theme <- function(gt_table, title_text, subtitle_text = NULL) {
gt_table |>
tab_header(title = md(paste0("**", title_text, "**")),
subtitle = subtitle_text) |>
opt_table_font(font = list(google_font("Arial Narrow"), default_fonts())) |>
tab_style(
style = cell_text(color = "navy", font = "Arial Narrow", size = px(13)),
locations = cells_body()
) |>
tab_style(
style = list(cell_text(color = "navy", size = px(16), weight = "bold")),
locations = cells_title(groups = "title")
) |>
tab_style(
style = cell_text(color = "gray40", size = px(13)),
locations = cells_title(groups = "subtitle")
) |>
tab_options(
table.border.top.color = "navy",
table.border.bottom.color = "navy",
table.border.top.width = px(2),
table.border.bottom.width = px(2),
heading.align = "center",
data_row.padding = px(4)
)
}
did_table |>
gt() |>
my_gt_theme(
title_text = "Difference‑in‑Differences Regression: Nike vs Control",
subtitle_text = "Model:lm(avg_close ~ post * treatment)"
) |>
tab_footnote(
footnote = "The interaction (Post × Treatment) coefficient estimates the average causal effect on Nike's stock price\nrelative to the control group after each viral event."
)
```
The difference-in-differences model compares Nike’s stock price movements to a control (S&P 500 Index) before and after each viral event. The interaction term (Post × Treatment) represents the estimated causal effect of the viral event on Nike’s stock price relative to broader market trends. The coefficient is small and statistically insignificant, which suggests that **Nike’s stock did not respond differently from the overall market in the aftermath of these viral sports moments.**
## 4. Discussion
#### 4.1 Conclusions
This study examined whether highly visible viral sports moments involving Nike-endorsed athletes were associated with abnormal movements in Nike’s stock price. Across multiple empirical approaches—including **event-window comparisons, regression models, and difference-in-differences estimation—there was no consistent evidence of statistically meaningful impacts on stock returns following these events.** While some events were associated with minor short-term price changes, these effects were small in magnitude and inconsistent in direction.
These findings suggest that although viral sports moments generate substantial public attention and media visibility, they do not appear to materially affect investors’ expectations or the market valuation of a large and diversified firm such as Nike in the short run. This result aligns with the interpretation that public equity markets may efficiently incorporate marketing-related information, or that the **economic implications of such events are relatively modest compared to broader market forces.**
This does *not* mean that viral sports moments have no marketing value or economic impact. Instead, our results suggest that the effects of vitality may be **captured through channels other than stock price**, such as brand equity, social media engagement, or product sales. It is also possible that the overall size and stability of Nike as a global corporation reduce the impact that individual athlete moments—no matter how viral—have on investors’ expectations.
Overall, these findings contribute to a broader understanding of how **sports performance**, **marketing exposure**, and **financial markets** intersect. While viral moments undoubtedly shape athlete narratives and brand visibility, their influence on stock performance appears limited, at least within this study.
#### 4.2 Limitations
There were several limitations to this project and data set.
First, we relied on a **limited number of viral sports moments**. Many viral sports events do not have perfectly defined dates, and some moments unfold over days or weeks, making them less suitable for short-window event studies. We selected events that had a clear single date, but this restricts the generalization of our findings.
Second, the study focuses exclusively on Nike using a single historical stock price dataset from Kaggle. As a large, multinational firm with diversified revenue streams, **Nike’s stock price may be less sensitive to firm-specific marketing shocks than smaller or less diversified companies.** Additionally, because we used daily stock price data, we could not capture intranet **movements**, which might reveal more immediate market reactions.
Third, this study does not incorporate direct measures of virality, such as social media engagement, search activity, or advertising exposure. The viral events were treated as binary indicators, which may o**versimplify the true variation in public attention and marketing intensity across events.**
Finally, stock returns are only one measure of business performance. Viral moments may influence **brand perception**, **consumer engagement**, or **sales**, none of which were captured in this data set. Nike’s financial performance is influenced by global economic factors, supply chain conditions, and quarterly earnings, which may dilute the measurable effects of short-lived viral attention.
#### 4.3 Further Questions
Future research could extend this analysis in several important ways. Incorporating **direct measures of virality—such as social media impressions, engagement rates, and search trends**—would allow for a more precise identification of the mechanisms linking public attention to financial market outcomes.
Expanding the study to **include additional firms such as Adidas, Under Armour, and Puma would enable cross-company comparisons** and improve external validity. Additionally, examining **alternative types of events, such as endorsement announcements or product launches,** may reveal different dynamic patterns in stock price responses.
Finally, the use of **higher-frequency financial data or longer event windows** could help capture delayed or short-lived market reactions that are not observable in daily closing price data. These extensions would provide a more comprehensive understanding of how viral sports moments interact with corporate performance and financial markets.
Overall, these extensions would provide a richer picture of how vitality in sports interacts with corporate performance and could help marketers and analysts better understand the economic value of athlete-driven attention